const jwt = require('jsonwebtoken');
const redisClient = require('../config/redis');

const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
const TOKEN_EXPIRY = '12h';
const REDIS_EXPIRY = 12 * 60 * 60;

const generateToken = (userId) => {
  // 只使用用户ID生成token
  return jwt.sign({ userId }, JWT_SECRET, { expiresIn: TOKEN_EXPIRY });
};

const verifyToken = async (token) => {
  try {
    // 添加日志
    console.log('开始验证token:', token);
    
    // 先验证token格式
    const decoded = jwt.verify(token, JWT_SECRET);
    console.log('token解析结果:', decoded);
    
    // 检查token是否在redis黑名单中
    const isBlacklisted = await redisClient.get(`bl_${token}`);
    console.log('黑名单检查结果:', isBlacklisted);
    
    if (isBlacklisted) {
      throw new Error('Token已失效');
    }
    return decoded;
  } catch (error) {
    console.log('Token验证失败具体原因:', error.message);
    throw error;
  }
};

const invalidateToken = async (userId, newToken) => {
  try {
    // 获取旧token
    const oldToken = await redisClient.get(`user_${userId}`);
    console.log('获取到的旧token:', oldToken);
    
    // 如果存在旧token，加入黑名单
    if (oldToken) {
      await redisClient.set(`bl_${oldToken}`, '1', {
        EX: REDIS_EXPIRY
      });
      console.log('旧token已加入黑名单');
    }
    
    // 保存新token
    await redisClient.set(`user_${userId}`, newToken, {
      EX: REDIS_EXPIRY
    });
    console.log('新token已保存');
  } catch (error) {
    console.error('Token操作错误:', error);
    throw error;
  }
};

module.exports = {
  generateToken,
  verifyToken,
  invalidateToken
}; 